# kind: Trigger

Конфигурация предназначена для реализации метки (label), необходимой для инициализации мутации. Также в данной конфигурации описывается список контейнеров/аннотаций/томов (для их мутации в пользовательском ресурсе).

Теперь следует реализовать правила, по которым будет вызываться инжектирование описанного ранее sidecar.

```yaml
kubectl create -f - << EOF
apiVersion: kubelatte.synapse.sber/v1alpha1
kind: Trigger
metadata:
  name: busybox-injection-trigger
  namespace: kubelatte
spec:
  mutationConfigs:
    - annotationNamespace: kblt.synapse
      annotationTrigger: busybox-injection
      containers:
        - kubelatte/busybox-template/busybox
      name: busybox-injection
      updateStrategy: merge
EOF
```

| Поле       | Назначение               |
|------------|--------------------------|
| [mutationConfigs](#mutationConfigs)  | Список условий, при которых должен выполниться мутирующий webhook, а так же ресурсы sidecar/volumes |
| templateRefs | Список темплейтов. Каждый темплейт будет обработан как отдельная мутация по порядку. Ссылка на темплейт «kind: Template» (type: mutation) в формате \<namespace>/\<name of mutation template>                        |

## mutationConfigs

Список условий, при которых должен выполниться мутирующий webhook, а так же ресурсы sidecar/volumes 

```
```

| Поле               | Назначение               |
|--------------------|--------------------------|
| name               | Уникальное наименование условия (конструкция аннотации)                                      |
| updateStrategy     | Стратегия по которой будет производиться мутирование. Возможно указание одного из значений: <br> <br> replace - описанный шаблон в "kind: Template" перезапишет всю спецификацию контейнера/объекта мутации <br> <br> merge - описанный шаблон в "kind: Template" частично перезапишет мутируемый объект, в зависимости от уровня различий между шаблоном и мутируемым ресурсом                             |
| [match](#match)               | Правила выбора запросов для проведения мутаций. Если указанные в этой секции условия выполнены – мутация будет производится. Другими словами это правила, на которые реагирует «kind: Trigger»                                        |
| templateRefs       | Список шаблонов которые будут применены при мутации (формат: - <имя проекта шаблона>/<имя шаблона «kind: Template»>)            |


## match

Правила выбора запросов для проведения мутаций. Если указанные в этой секции условия выполнены – мутация будет производится. Другими словами это правила, на которые реагирует «kind: Trigger»

```yaml
apiVersion: kubelatte.synapse.sber/v1alpha1
kind: Trigger
metadata:
  name: my-gateway
  namespace: some-namespace
spec:
  mutationConfigs:
    - name: mutation-config-test
      match:
        kinds:
          - kinds:
              - Pod
            apiGroups:
              - '*'
        annotationSelector:
          matchExpressions:
            - key: kblt.synapse/mutation-test
              operator: In
              values:
                - enabled
        labelSelector:
          matchExpressions:
            - key: find-pod
              operator: In
              values:
                - fedmesh-mutator
        name:
          regex: mutating-deployment-test*
        scope: Namespaced
        operations:
          - CREATE
        matchConditions:
          object:
            - path: spec.containers[?@.name == `to-test-latte-1`]
              condition: MustExist
```

| Поле               | Назначение                               |
|--------------------|------------------------------------------|
| [userInfo](#userInfo)       | Наименование ServiceAccount/User. Конкретизация пользователя, кто создает объект (type: validation)             |
| kinds              | Перечень типов ресурсов, которые будут мутированы по шаблону                                                         |
| [namespaceSelector](#namespaceSelector)  | Метка (label) на namespace, в рамках которых будет происходить мутация                                      |
| [labelSelector]()      | Метка (label) на объекте, по которому будет происходить мутация                                              |
| [annotationSelector](#annotationSelector) | Аннотация на объекте, по которому будет происходить мутация                                                 |
| [name](#name)               | Наименование объекта, по которому будет происходить мутация. Если нет этого поля, то проверка по имени обекта не проихводится                                                 |
| excludedNamespaces | Список исключенных namespace, по которым не будет происходить мутация                                           |
| namespaces         | Список namespace, по которым будет происходить мутация                                                         |
| scope              | Тип объекта, по которому будет происходить мутация <br> <br> Возможные значения: '*', Namespaced, Cluster                 |
| operations         | Операции над объектом, по которым будет происходить мутация (CREATE/UPDATE/DELETE)                                     |
| [matchConditions](#matchConditions) | Условия на принятие решения состояния (старого/нового)  конфигурации (валидации/мутации конфигурации)                                      |

## userInfo

Наименование ServiceAccount/User. Конкретизация пользователя, кто создает объект (type: validation)

```
```

| Поле               | Назначение                                            |
|--------------------|-------------------------------------------------------|
| username           | Наименование ServiceAccount/User. Конкретизация пользователя, кто создает объект               |
| usernameRegex      | Регулярное выражение для ServiceAccount/User. Конкретизация пользователя, кто создает объект   |

## namespaceSelector

Метка (label) на namespace, в рамках которых будет происходить мутация

```
```

| Поле               | Назначение                                            |
|--------------------|-------------------------------------------------------|
| [matchExpressions](#matchExpressions)   | Значение метки (labels)                               |


## labelSelector

Метка (label) на объекте, по которому будет происходить мутация

```
```

| Поле               | Назначение                                            |
|--------------------|-------------------------------------------------------|
| [matchExpressions](#matchExpressions)   | Значение метки (labels)                               |



## annotationSelector

Аннотация на объекте, по которому будет происходить мутация

```
```

| Поле                   | Назначение                                            |
|------------------------|-------------------------------------------------------|
| [matchExpressions](#matchExpressions)   | Значение метки (labels)                               |

## matchExpressions

Значение метки (labels) 

```
```

| Поле                   | Назначение                                            |
|------------------------|-------------------------------------------------------|
| key                    | Ключ метки (label)                                    |
| values                 | Значение метки (label)                                |
| operator               | Операция при сравнении метки (label) (In/NotIn)       |

## name

Наименование объекта, по которому будет происходить мутация

```
```

| Поле               | Назначение                                            |
|--------------------|-------------------------------------------------------|
| value              | Наименование мутируемой конфигурации                  |
| regex              | Регулярное выражение для имени мутируемой конфигурации|


## matchConditions

Условия на проверку старого/нового состояния конфигурации

```yaml
apiVersion: kubelatte.synapse.sber/v1alpha1
kind: Trigger
metadata:
  name: universal-mutating
  namespace: $NAMESPACE
spec:
  mutationConfigs:
    - name: my-config-with-object
      match:
        ...
        matchConditions:
          object:
            - path: spec.containers[?@.name == `some-name-1`]
              condition: MustExist
          oldObject:
            - path: spec.containers[?@name == `some-name-2`]
              condition: MustExist
            - path: spec.containers[?@name == `some-name-3`]
              condition: MustNotExist
```

| Поле                   | Назначение                                            |
|------------------------|-------------------------------------------------------|
| [oldObject](#(old)Object)          | Секция для проверки бывшей реализации CRD для принятия решения о проведения мутации  |
| [object](#(old)Object)             | Секция для проверки новой реализации CRD для принятия решения о проведения мутации   |

## (old)Object

Секция для проверки бывшей/новой реализации CRD для принятия решения о проведении мутации 

| Поле                   | Назначение                                            |
|------------------------|-------------------------------------------------------|
| path                   | Конкретизация секции, формата JMESPath query          |
| condition              | enum: <br> <br> MustExist - ожидаемый результат "true" в рамках обработки секции path (наличие любого текста, либо boolean 'true') <br> <br> MustNotExist - ожидаемый результат "false" в рамках обработки секции path (отсутствие любого текста, либо boolean 'false')                         |